www.gusucode.com > 精通MATLAB最优化计算全书代码 程序源码 > 随书源码_精通MATLAB最优化计算/第12章 二次规划/TrackRoute.m
function [xv,fv] = TrackRoute(H,c,A,b,x0,y0,w0,p,delta,tolX) if min(y0) <= 0 disp('y0的每个分量必须大于0!'); xv = NaN; fv = NaN; return; end if min(w0) <= 0 disp('w0的每个分量必须大于0!'); xv = NaN; fv = NaN; return; end if nargin == 9 tolX = 1.0e-6; end sz = size(A); m = sz(1); tol = 1; while tol>tolX Y = diag(y0); W = diag(w0); lu = b - A*x0+w0; sigma = c + H*x0 - transpose(A)*y0; gama = transpose(y0)*w0; mu = delta*gama/m; SA = [-H transpose(A);A inv(Y)*W]; SB = [c+H*x0 - transpose(A)*y0;b - A*x0+mu*inv(Y)*ones(m,1)]; ds = SA\SB; dx = ds(1:length(x0)); dy = ds((length(x0)+1):length(ds)); dw = inv(Y)*(mu*ones(m,1) - Y*W*ones(m,1) - W*dy); ry = - dy./y0; rw = -dw./w0; vec = [ry;rw]; mr = max(vec); lamda = min(p/mr ,1); x0 = x0 + lamda*dx; y0 = y0 + lamda*dy; w0 = w0 + lamda*dw; tollu = norm(lu); tolsigma = norm(sigma); tolgama = abs(gama); tol = max(tollu,tolsigma); tol = max(tol,tolgama); end xv = x0; fv = transpose(xv)*H*xv/2 + transpose(c)*xv;